package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;


import educar.db.DbConnection;
import educar.db.JPA;

public class Cargo
{
    private static JPA jpa = new JPA();
    private static final String noAsignado = "-1";
    private String descripcionCargo;
    private String codigoCargo;

    
    public String toString()
    {
    	return descripcionCargo + " - " + codigoCargo;
    }
    
    private Cargo(String nombre, String codigo)
    {
        codigoCargo = codigo;
        descripcionCargo = nombre;
    }

    public Cargo(String nombre)
    {
        codigoCargo = noAsignado;
        descripcionCargo = nombre;
    }

    public boolean save()
    {
        String[] columns = { "codigoCargo", "descripcionCargo" };
        PreparedStatement stm = jpa.newRecord(DbConnection.bd+".cargo", columns);
        try
        {
            stm.setString(1, null);
            stm.setString(2, descripcionCargo);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return false;
        }

        jpa.create(stm);
        actualizarCodigoCargoAlMaximo();

        return true;
    }

    //para utilizar al guardar un cargo en la base de datos
    //y obtener el codigo que le fue asignado en el objeto
    //utilizar sólo inmediatamente despues de guardar en la base de datos
    private void actualizarCodigoCargoAlMaximo()
    {
        ResultSet rs = jpa.showMaxColumn("cargo", "codigoCargo");
        try
        {
            if (rs.next())
            {
                this.codigoCargo = rs.getString(1);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void destroy() throws cargoNotFound
    {
        if (codigoCargo.compareTo(noAsignado) != 0)
            jpa.destroy("cargo", "codigoCargo", String.valueOf(codigoCargo));
        else
            throw new cargoNotFound();
    }

    public void update() throws cargoNotFound
    {
        if (codigoCargo.compareTo(noAsignado) != 0)
            jpa.update("cargo", "descripcionCargo", descripcionCargo, "codigoCargo", codigoCargo);
        else
            throw new cargoNotFound();
    }

    public static Cargo getCargobyName(String nombre) throws cargoNotFound
    {
        ResultSet rs = null;
        Cargo c = null;

        rs = jpa.getByField("cargo", "descripcionCargo", nombre);

        try
        {
            if (rs.next())
            {
                c = new Cargo(rs.getString(2), rs.getString(1));
            }
            else
            {
                throw new cargoNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return c;
    }

    public static Cargo getCargobyId(String id) throws cargoNotFound
    {
        ResultSet rs = null;
        Cargo c = null;

        rs = jpa.getByField("cargo", "codigoCargo", String.valueOf(id));

        try
        {
            if (rs.next())
            {
                c = new Cargo(rs.getString(2), id);
            }
            else
            {
                throw new cargoNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return c;
    }

    public static LinkedList<Cargo> getAll()
    {
        ResultSet rs = null;
        LinkedList<Cargo> cargos = new LinkedList<Cargo>();
        rs = jpa.showAllOrderBy("cargo", "codigoCargo");
        try
        {
            while (rs.next())
            {
                cargos.add(new Cargo(rs.getString(2), rs.getString(1)));
            }

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return cargos;
    }

    public static String[] getAllCargosArray()
    {
        LinkedList<Cargo> l = getAll(); //TODO: pedir unicamente la columa nombre a la db
        String[] cargos = new String[l.size()];
        for (int i = 0; i < l.size(); i++)
            cargos[i] = l.get(i).toString();

        return cargos;
    }

    public String getDescripcionCargo()
    {
        return descripcionCargo;
    }

    public String getCodigoCargo()
    {
        return codigoCargo;
    }

    public void setDescripcion(String descripcion)
    {
        descripcionCargo = descripcion;
    }

    public void setCodigo(String codigo)
    {
        codigoCargo = codigo;
    }

}
